// -----------------------------
// Author: 		Dhaenens Gert	
// Creation: 	8/2/2013 7:19:04 PM				
// -----------------------------

#include "LuaError.h"
#include "Lua.h"
#include "LuaException.h"
#include "LuaStackDump.h"

#include "LuaIncl.h"

namespace ObjectLua
{

	ErrorPolicy LuaError::s_ErrorPolicy = ErrorPolicy::Default;

	void LuaError::setPolicy(ErrorPolicy ePolicy)
	{
		s_ErrorPolicy = ePolicy;
	}

	void LuaError::handleError(lua_State* lpLua)
	{
		// Get the Error from the Stack
		const char* lpError = lua_tostring(lpLua,-1);
		lua_pop(lpLua,1);

		// Return if it should not handle the Error
		if(s_ErrorPolicy == ErrorPolicy::NoThrow)
			return;

		// Throw a LuaException if it should
		// handle the error
		throw LuaException(lpError);
	}

	const char* LuaError::stackTrace(lua_State* lpLua)
	{
		// Call the Debug Traceback
		lua_getglobal(lpLua, "debug");
		lua_getfield(lpLua, -1, "traceback");
		lua_pop(lpLua,-2);
		lua_pushvalue(lpLua, 1);
		lua_pushinteger(lpLua, 2);

		lua_call(lpLua, 2, 1);

		// Get the Lua String
		return lua_tostring(lpLua, -1);
	}


	LuaError::LuaError()
	{
	}
	
	LuaError::~LuaError()
	{
	}

}